揭秘《Sherman》:使用Unity制作影视级光照效果
《Sherman》是由曾荣获艾美奖的《大白的梦》创作团队,使用Unity高清晰渲染管线HDRP制作的实时渲染动画短片。
Unity媒体与娱乐创新团队的光照主管Jean-Philippe Leroux参与制作了一些优秀影视动画项目,包括:《ADAM 2》和《ADAM 3》,以及《大白的梦》。
现今影视动画行业,正在进行着重大变革-实时制作的兴起。实时动画现在不仅仅是一个渲染解决方案,它还革新了整个创作流程。
实时创作引擎最初是用于游戏开发的工具,随着画面质量的提高和技术的不断成熟,如今实时创作引擎已经能够作为创作工具,制作影视级的内容。
那么实时渲染与离线渲染有什么不同呢?我们是如何把大型渲染农场上数小时的处理过程,转变为在几秒内实现的即时反馈和4K画质结果呢?这里没有使用任何魔法,而是许多简化操作、近似处理、优化过程和小技巧结合起来的结果。
我们制作的实时渲染动画短片《Sherman》的目标之一:展示HDRP制作高级实时渲染效果的能力。
本文,Jean-Philippe Leroux将重点介绍如何在Unity实现《Sherman》的实时光照解决方案,并提供实用的建议与技巧。不论你是3D动画专家还是传统光照艺术家,本文都将提供需要的工具,帮助你在Unity中为实时内容创建丰富而细腻的光照效果。
解析《Sherman》
在下图的画面中,光照部分进行了很多处理,我们将详细讲解所有元素是如何结合起来的。在这个镜头中,我们可以梳理出几乎所有Unity光照效果方面的知识,以便你在自己的项目中活学活用。
我们可以把实现该画面的光照效果分为四类,然后分别介绍如何控制这些光照类型。
掌控环境光照
如下图所示,展现了间接漫反射光照即全局光照对画面的影响。
首先,我们定义场景的环境光照。在《Sherman》中,环境光照并不是简单地使用一个环境光来模拟光线散射,而是利用了Unity渐进式光照贴图,将全局光照的结果烘焙到光照贴图中,制作出局部的环境光照。
光照贴图
我们的项目使用了多场景设置,所有静态场景元素保存在episode_set场景游戏对象。场景光照元素保存在Unity的活动场景episode_set_lighting中。这点非常重要,因为活动场景决定生成的光照数据保存在什么位置。
了解多场景工作流程:
https://docs.unity3d.com/Manual/MultiSceneEditing.html
我们不需要使用001_timeline场景来构建场景光照,因此在制作过程中,我们会卸载该场景。如果仔细观察,我们可以看到名称为ToHide的部分,其中包含一个摄像机和一个太阳定向光的实例。
一些后期处理效果对光照很重要,例如:色调映射和环境遮蔽,但我们需要摄像机来呈现这些效果。在给场景添加光照时,我们使用一个临时的摄像机,而在项目完全加载后,应该只会留下一个摄像机。当烘焙完成后,ToHide调试摄像机和光照会被再次隐藏起来。
对于光照贴图中的任何对象来说,相应的UV不应该发生重叠,每个表面都需要有特定的UV。大部分情况下,我们可以在导入时让Unity自动生成光照贴图UV。
了解更多UV内容:
https://docs.unity3d.com/Manual/LightingGiUvs-GeneratingLightmappingUVs.html
对于复杂的有机对象,最好让美术使用数字内容创作DCC软件来制作UV2。如果想要在光照贴图中不连续的边缘上,实现更加平滑的结果,拼接缝隙是一个简单的方法。
下图为Unity Lighting设置面板。
我们来看看Lighting光照标签页,了解制作《Sherman》场景的光照设置:
首先,我们在CPU渐进式光照贴图中使用了Mixed Lighting Bake Indirect。由于HDRP不支持Realtime Global Illumination(实时全局光照),因此我们没有使用该功能。
每次发布新版本的Unity时,GPU Lightmapper都有很大的改进,但在制作《Sherman》时,它仍缺少我们需要的关键功能。
我不喜欢使用Shadowmask模式,该模式会将阴影和大部分光照烘焙到光照贴图中,以进行动画制作。
通过使用Bake Indirect,光照计算会非常简单,但分辨率较低,这意味着烘焙时间更短,而且我们可以灵活地矫正每个镜头的光照方向。
Direct Samples设置和所选模式没有任何关系,因为我们没有烘焙任何直接光照,因此可以无视该设置。
一开始可以将Indirect Sample的数值设置得小一点,例如:250左右,在确定场景设置后,我们可以提高该数值。
对于Bounces设置,一般设为2就够了,但如果是室内场景,我建议设为4。
在设置Lightmap Resolution时,可以先设置较小的数值,随后逐渐增大。在此场景中,我们最后选择的分辨率为10,因此每平方米有100个纹素。
请注意:在光照和物理方面的设置中,我们要把1个Unity单位等价于真实环境中的1米。
在场景中,了解和利用网格的Scale In Lightmap参数非常重要。如果小型对象的三角面太小,无法覆盖多个光照贴图纹素,我们可以提高Scale In Lightmap值,对于远处的较大对象,我们可以减小该值。我们可以启用Baked Lightmap视图和Show Lightmap Resolution选项,轻松预览光照贴图的分辨率。
并非所有对象都适合添加光照贴图。我们不应该为光照贴图标记多个表面的复杂对象,或是对全局光照影响不大的小型对象,例如:草、树叶、小石子或碎片,否则渲染光照贴图耗费的性能开销会很大。为此,我们可以禁用Lightmap Static。
部分大型静态对象也不适合使用光照贴图,例如:短片中的篱笆,但我们仍希望它们能够影响光照解决方案。
为了让对象对光照产生影响的同时,不必为其制作光照贴图,我们在此使用了一个技巧:把该对象的Scale In Lightmap值设为0。例如:在篱笆的边缘部分,我们可以清楚看到篱笆对光线的遮蔽效果,即使篱笆没有制作光照贴图。
下图中展示了场景视图设置,以及篱笆区域光照贴图的近距离效果。
在其它部分使用光照探针
在设置好环境光照和光照贴图后,光照探针组将照亮剩余的小型动态对象。在《Sherman》中,我们创建了一组间距为1米的光照探针组。
通过巧妙使用光照探针代理体积,草坪等大型对象会从更为精细的探针光照中受益。通过这种方法,对象会被局部探针采样照亮,而不是被单个探针照亮。
下图中为在大型对象上使用光照探针代理体积的效果。我们可以看见,被不同探针照亮的草地会被分为大块的区域。
小提示:在多场景设置中,只有来自最近加载场景的光照探针会在光照中考虑。
环境遮蔽
现在我们已经了解如何产生精美的局部环境光照,那么要如何才能避免环境光照填补不应该影响的区域光,并让对象接触到地面呢?
首先,我们需要使用常用的DCC工具,为部分对象生成环境遮蔽贴图,例如:狗窝内部和浣熊的嘴巴。
然后,我们使用屏幕空间环境遮蔽(SSAO)后期处理效果来将元素结合在一起。我们会在之后的后期处理部分进行详细介绍。
规划反射效果
如下图所示,左侧画面为使用间接镜面反射光照的部分,右侧画面为结合环境反射和烘焙反射的效果。
在实时环境中,间接镜面光照即反射效果是一系列技术结合的成果。这些技术包括:
实时平面反射
实时反射探针
小型烘焙反射探针
大型反射探针:较小探针体积的优先级比较大探针体积更高
天空
平面反射效果示例
反射效果分辨率和缓存大小都通过HDRenderPipelineAsset资源来管理。平面反射就跟镜子一样,这类反射非常适合平坦表面,但也能够用于较复杂的情况,例如:影片中浣熊和膨胀的水管表面上的反射。但须小心使用这类效果,因为它们会使用较多内存。
实时反射探针也可以用于展示光源上反射和遮蔽部分的重要细节。在影片中,我们使用了一个小的实时球型探针来包住食盆,在上面反射出即将爆炸的水管。
我们需要使用烘焙反射光照探针来覆盖场景。我们应该利用大小探针的不同优先级,投射体积的视差矫正和高级混合模式。一个不错的方法是:将光照捕捉点放在摄像机工作的平均高度上。
如果仔细观察,我们会发现部分反射探针专门用于阴影区域。这些探针用来消除来自天空的定向光产生的多余镜面反射效果。
使用Timeline
对于所有基于动画的内容而言,Timeline是实用的序列工具和管理中心。在Timeline上,我们可以为大部分对象添加动画,而在制作每个镜头的光照时,我们使用的是Activation Track激活轨道。
相对于在各个镜头调整光照绑定的每个组件,我认为管理特定镜头的分组会更加简单。下图展示了跟随摄像机变换的光照分组激活轨道。
下面是使用Timeline的一些小技巧:
如果希望在Timeline上为某个对象添加动画,对象一定要和Timeline本身在同一个场景。在《Sherman》中,Timeline所在的场景为001_timeline场景。当重新打开项目或进入运行模式时,指向其它场景的链接都会丢失。
禁用Post-playback状态,否则在进行渲染时,场景会保留播放后的光照绑定。
在修改镜头编辑内容或时间设置时,可以将动画轨道转换为剪辑轨道,方便重新安排动画。
了解更多关于激活轨道的信息:https://docs.unity3d.com/Manual/TimelineActivationTrackProperties.html
使用预制件
预制件非常适合对需要多次重复使用的对象进行分组,我们可以使用预制件修改分组的组成内容,所有对应实例会自动发生相应变化。
在预制件实例上,我们可以选择性撤销任何改动,也可以将实例恢复原始预制件的样子,即时应用预制件的改动。此外,预制件系统也提供框架,实现无缝派生的工作流程,不仅可以调整实例,也可以快速创建和验证变体。
从Unity 2018.2版本开始,Unity支持预制件嵌套功能,该功能非常适用于光照绑定的快速迭代。
下图展示了第一个动画的光照预制件结构,我们可以从中看到激活轨道上每个镜头的结构。由于只展示当前镜头中存在的光照对象,因此其它对象都暂时被隐藏起来。
在场景层级窗口的光照部分中,我们可以看到:
场景设置的重写对象
在镜头中严格用于构成阴影的对象
控制大气效果的密度体积
食盆的实时反射探针
太阳光、补光与边缘光等其它预制件
使用预制件系统还有另一个好处:当对象在场景中实例化后,在处理光照时,不必在版本控制工具中反复检查场景。这意味着,团队的其他成员也能够在场景中进行制作。
需要注意的是:预制件上的部分属性无法派生变化,需要使用自定义实例来实现变化,相关情况包括:体积配置文件、后期处理配置文件和Timeline等可编程对象。
添加太阳光
每个镜头分组都有一个太阳的实例,我们可以在每个镜头进行太阳朝向的微调。如下图所示,我们还使用了树木的裁剪贴图,来制作有趣的阴影效果。
高质量阴影
通过进行正向渲染,HDRP为我们提供了百分比近距离柔和阴影(PCSS),它可以模拟光线照射在对象上产生的半阴影。
在实时环境下,光线没有使用光线追踪功能,我们使用阴影贴图来产生阴影。阴影会耗费一定的性能,而且每个光线都需要启用阴影。
HDRP的阴影图集系统让我们可以使用大量能够投射阴影的光线。在《Sherman》中,我们尽可能使用了最大的阴影图集。虽然较大的阴影图集能够极大地提升画质,但由于所含的信息更多,因此计算时间也更长,
如果阴影图集的信息变得饱和,该系统会动态地调整阴影大小。阴影分辨率会根据光线来定义。在我们的设置中,精准光源的分辨率设为1024,而定向光分辨率设为4x2048。注意:为了表示立方体,点光源的分辨率设为6x1024,因此它们非常消耗性能。
定向光阴影可以使用级联阴影贴图CSM技术来优化。为了获得最佳质量,我们需要通过使用HD Shadow Settings组件的重写,来调整每个镜头的级联阴影分布。
我们也需要在Cinemachine的虚拟摄像机镜头设置中,调整近距离剪裁平面。这样可以向前推动第一个级联阴影,这步随着当前镜头的时长增加,会显得越来越重要。
使用体积(Volume)
在HDRP中,许多渲染和后期处理的属性都使用带有相关“配置文件”的体积来控制。在Unity 2019.1中,这两类属性被结合到相同的体积组件中,根据类别进行管理。
根据当前摄像机的位置,配置文件的数值会进行插值调整,如果摄像机不在任何体积中,那么这些属性会使用全局配置文件。每个体积都有优先级与权重值,配置文件的数值不能动态调整,但是优先级和权重值可以动态调整。
如下图所示,我们使用优先级与权重值这两个属性来制作浣熊的触电动画。
光照图层
在Unity中,我们可以将对象指定到特定光照图层上。如下图所示,我们手动为浣熊的眼睛加入眼神光,让其看起来更鲜活有趣。
我们还可以使用该功能管理不合适的镜面高光,这些镜面高光来自本应用于补光和边缘光的精准光源。我们通过使用该功能,避免精准光源影响水面效果。
控制直接镜面光照
HDRP有一个非常有趣的光照功能:可以调整光线的最大柔和度(Max Smoothness),该功能可用于模拟镜面光源特定大小的色散效果。
我们还能够将光照设定为影响镜面光(Affect Specular)或影响漫反射(Affect Diffuse),并在场景内容中测试这些设置的效果。
体积光照
在场景中实现深度感时,大气效果是我们的重要工具。HDRP高质量体积光在HDRP设置中定义,它提供了稳定可靠的解决方案,我们可以使用体积光照控制器(Volumetric Lighting Controller),来最大化效果的质量。
在《Sherman》中,为了实现最佳局部效果,我们使用了密度体积,逐个镜头进行放置,从而实现对这些外观的完整控制。
编辑器内颜色分级和摄像机效果
颜色分级效果在任何制片过程中都是必不可少的部分。我们可以使用该效果在Unity实现出色的结果。自从Unity 2019.1开始,后期处理效果已经完全集成到HDRP中。
下图展示了《Sherman》使用颜色分级(Color Grading)效果的前后对比。
本文,我将以《Sherman》的工作流程为基础进行介绍,在《Sherman》中,我们使用的是Post-Processing Stack V2。
请注意:Post-Processing Stack V2和Unity 2019.1中HDRP的Post-Processing Stack V3互不兼容。虽然有部分功能发生了改变,但基础概念还是一样的。
后期处理效果在体积上使用,我们可以在光照场景的主要体积上定义颜色分级、环境遮蔽、胶片颗粒和影视级动态模糊效果。这些设置可能会被部分Timeline上拥有更高优先级的体积所覆盖。
我们也可以使用CinemachinePostProcessing扩展,为每个针对Cinemachine虚拟摄像机创建的自定义配置文件,定义所有摄像机相关效果,包括:泛光、景深和晕影。在某些情况下,因为当时Unity 2018.4还没有预曝光处理功能,所以我们也使用了后期曝光重写功能。
色调映射
由于整个渲染过程发生在HDR线性空间中,设定颜色输出非常重要。《Sherman》项目一开始就决定使用ACES(学院色彩编码系统)输出,ACES色调映射提供高对比度的图像,带有非常强烈的暗色调。
为了获得色彩鲜亮的调色板,我们需要调整伽马值。使用这种色调映射风格的大多数游戏也会进行同样的调整。
轨迹球
我们的新Trackballs轨迹球工具,非常受人喜爱。对专业人员来说,轨迹球是非常熟悉的工具,它们易于操控。
下图为颜色分级设置中的Trackballs轨迹球控制面板。
颜色分级曲线
虽然每次只能展示一条曲线,但我们可以使用许多颜色分级曲线。我们使用了Hue vs Sat、Sat vs Sat和Lum vs Sat三种曲线。
我们给主摄像机添加了Post Process Debug组件,我们可以在该组件上,启用波形监视器和颜色直方图。波形监视器是非常强大的工具,适合分析黑色与白色部分的适宜程度。
环境遮蔽
上文已经提到过环境遮蔽,这里我们会详细介绍部分设置。
在《Sherman》中,Intensity光照强度被设为0.75,而在部分镜头中,我们会减小该值,以减少大多出现在树叶部分的噪声图案。
我们没有使用任何不基于物理的渲染(PBR)选项,例如:Color颜色或Direct Lighting Strength直接光照强度。环境遮蔽效果取决于分辨率,因此我们需要调整该效果,来适应预期的输出分辨率。
景深效果
景深DOF不只是快速镜头的额外效果,它也是在叙事中转移焦点的重要工具。图像会快速变化,因此我们需要小心处理观众的注意力。
Cinemachine有非常实用的跟踪焦点功能。新版本后期处理工具已经完全重写,不再取决于分辨率。
在Unity 2018中,Visual Effect Graph还没有透明度渲染队列功能。因此在《Sherman》包含水面效果的部分镜头中,我们必须避免出现较浅的景深效果。
好消息是,Unity 2019.2的Visual Effect Graph加入了透明度渲染队列功能。
晕影
晕影会模仿真实镜头拍摄时产生的瑕疵,呈现镜头画面边角部分的光线丢失效果。为了实现逼真的感觉,该效果应该总是偏圆形的。
请注意:晕影是非常强大的效果,但也容易被过度使用,请注意谨慎使用。
泛光
泛光是一种美观的瑕疵效果,它是由摄像机传感器和肮脏镜头漏出的强光产生的。我们可以在Unity模拟该效果,但也要记得合理使用。
结语
动画的光照很复杂,而且难以掌控。本文,我们针对传统光照艺术家讲解了在实时渲染影片中添加光照的所有知识。希望你能够喜欢本文,并主动尝试文中介绍的一些技巧。
我们已经回不到过去传统光照制作的“美好时光”了,实时动画制作正在革新创作方法,开启了新的可能性。由于有更多尝试和实验的空间,我们不必承担相应后果,因此可以创作更多优秀的作品。
了解更多关于《Sherman》的信息,下载完整的项目,请访问:
https://unity.com/solutions/film-animation-cinematics
了解Unity和创新团队如何创作项目:
https://unity.com/solutions/film/consultation
下载Unity Connect APP,请点击此处。 观看更多Unity官方精彩视频,请关注“Unity官方”B站账户。
你可以访问Unity答疑专区留下你的问题,Unity社区和官方团队帮你解答:
Connect.unity.com/g/discussion
推荐阅读
官方活动
Unity x HoloLens2联合直播:Unity开发HoloLens2初体明晚8点,Unity与微软的技术专家联袂带来Unity开发HoloLens2初体验,动手搭建开发环境和Demo制作。[了解详情...]11月25日-12月2日,Asset Store最受欢迎的资源将进行5折大促,每日一款特惠插件3折优惠。[了解详情...]
「Unity X 创想家计划」是针对中国地区9-15岁青少年的编程教育计划,火热报名中~~[了解详情...]
点击“阅读原文”下载工程项目
↓↓↓